import type { LoginResult } from "@/api/user";
import Cookies from "js-cookie";
import { storageSession } from "@pureadmin/utils";
import { useUserStoreHook } from "@/stores/modules/user";

/**
 * 用户信息 user-info 存储在 sessionStorage
 * token 储存在
 */

export interface DataInfo<T> {
  /** token */
  access_token: string;
  /** `accessToken`的过期时间（时间戳） */
  expires_in: T;
  /** 用于调用刷新accessToken的接口时所需的token */
  refresh_token: string;
  /** 用户名 */
  username?: string;
  /** 当前登陆用户的角色 */
  roles?: string[];
}

/** 用户信息 session key */
export const sessionKey = "sola_user_info";
/** 登陆 token key */
// export const TokenKey = "testor_token";

let tokenType = "Bearer";

/** 获取`token` */
export function getToken(): DataInfo<number> {
  // 优先获取 token，当获取不到 token 时获取 refreshToken
  // return Cookies.get(TokenKey)
  //   ? JSON.parse(Cookies.get(TokenKey))
  //   : storageSession().getItem(sessionKey);
  return storageSession().getItem(sessionKey);
}

/**
 * @description
 * 将`accessToken`、`expires`这两条信息放在key值为 `${TokenKey}` 的cookie里（过期自动销毁）
 * 将`username`、`roles`、`refreshToken`、`expires`这四条信息放在key值为 `${sessionKey}` 的sessionStorage里（浏览器关闭自动销毁）
 */
export function setToken(data: LoginResult<number>) {
  let expires = 0;
  const { access_token, refresh_token, token_type, user_id } = data;
  // NOTE: cookie expires 如果后端未返回需要根据项目情况自行设置 token 过期时间
  // expires = new Date(data.expires_in).getTime(); // 如果后端直接设置时间戳，将此处代码改为expires = data.expires，然后把上面的DataInfo<Date>改成DataInfo<number>即可
  /** 针对 cup 框架过期时间特殊处理⬇️ */
  expires = data.expires_in * 1000 + new Date().getTime(); // token 过期时间
  tokenType = token_type;
  const cookieString = JSON.stringify({
    access_token,
    expires,
  });

  // 根据后端返回的过期时间设置 cookie expires
  console.log(new Date(Date.now() + expires), "zzz date", expires);
  // expires > 0
  //   ? Cookies.set(TokenKey, cookieString, {
  //       expires: new Date(expires),
  //     })
  //   : Cookies.set(TokenKey, cookieString);

  function setSessionKey(username: string, roles: Array<string>) {
    useUserStoreHook().SET_USERNAME(username);
    useUserStoreHook().SET_ROLES(roles);
    storageSession().setItem(sessionKey, {
      access_token,
      refresh_token,
      expires,
      username,
      roles,
      user_id,
    });
  }
  if (data.user_name && data.role_name) {
    const { user_name, role_name } = data;
    setSessionKey(user_name, role_name?.split(",") || []);
  } else {
    const username =
      storageSession().getItem<DataInfo<number>>(sessionKey)?.username ?? "";
    const roles =
      storageSession().getItem<DataInfo<number>>(sessionKey)?.roles ?? [];
    setSessionKey(username, roles);
  }
}

/** 删除`token`以及key值为`${TokenKey}`的session信息 */
export function removeToken() {
  // Cookies.remove(TokenKey);
  sessionStorage.clear();
}

/** 格式化token（jwt格式） */
export const formatToken = (token: string): string => {
  return `${tokenType} ` + token;
};
